<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div>
    <p></p>
    <span></span>
    <!-- this is comment -->
  </div>
</body>

<!-- 
  遍历节点数
  a.parentNode 父节点  childNodes 子节点们  firstChild 第一个子节点 
  lastchild最后一个子节点
nextSibling 后一个兄弟节点  previousSibling 前一个兄弟节点 -->

<!-- 基于元素的节点数遍历
parentElement  返回当前元素的父元素节点
children  只返回当前元素的元素子节点
node.childElementCount === node.child.length  当前元素节点的子元素
firstElementChild  返第一个元素节点（ie不兼容）
lastElementChild   返回最后一个元素节点 （ie不兼容）
nextElementSibling 后一个兄弟节点  previousElementSibling 前一个兄弟节点

-->


<!-- nodeType  元素的标签名，以大写形式表示，只读

nodeValue test节点或comment节点的文本内容，可读写

nodeType 该节点的类型，只读

attributes  Element节点的属性集合 -->

<!-- document -> htmlDocument.prototype -> document.protptype
         -> XMLDocument -->

<script>
  // var a = document.getElementsByTagName('div')[0]

// 1.遍历元素节点数



// 2.封装函数，返回元素e的第n层祖先元素节点
// function retParent(elem,n) {
//   while(n && elem) {
//     elem = elem.parentElement;
//     n--;
//   }

//   return elem
// }



// 3.封装函数，返回元素e的第n个兄弟元素节点，n为正，返回后面的兄弟元素节点
// n为负，返回前面的兄弟元素节点，n为0，返回自己

// function retSibling(e,n) {
  // if(n > 0) {
  //   while
  // }else{
  //   while()
  // }
  
//   while(n && e) {
//     if(n>0) {
//       if(e.nextElementSibling) {
//         e = e.nextElementSibling;
//       }else{
//         e =  e.nextElementSibling
//         for(e = e.nextSibling;e && e.nodeType != 1; e = e.nextSibling) ;
//       }
//       n--
//     }else{
//       if(e.previousElementSibling) {
//         e = e.previousElementSibling;
//       }else{
//         for(e = e.previousElementSibling; e && e.nodeType != 1;
//           e = e.previousElementSibling) ;
//       }
//       n++
//     }
    
//   }

//   return e
// }


// 4.编辑函数，封装myChildren功能，解决以前部分浏览器的兼容性问题, 通过nodeType来判断
// 节点的类型

// Element.prototype.myChildren = function() {
//   var child = this.childNodes;
//   var len = child.length;
//   var arr = [];
//   for(var i = 0; i < len; i++) {
//     if(child[i].nodeType == 1){
//       arr.push(child[i])
//     }
//   }

//   return arr;
// }



// 5.封装hasChildrn()方法，不可用children属性，依旧通过nodetype来判断有没有节点了
// Element.prototype.myChildren = function() {
//   var child = this.childNodes;
//   var len = child.length;
//   var arr = [];
//   for(var i = 0; i < len; i++) {
//     if(child[i].nodeType == 1){
//       return true
//     }
//   }

//   return false;
// }


// var div = document.createElement('div')  创建元素节点

// var text = document.createTextNode('yangkang')  创建文本节点



// appendChild是一个剪切的操作
// var div = document.getElementsByTagName('div')
// var span = document.getElementsByTagName('span')
// div.appendChild(span)



// div.insertBefore(strong,span)    insert a before b



// div.removeChild()  剪切掉有返回值
// div.remove() 直接删除

// parentNode.replaceChildJ(new ,origin)  新替换老 origin 被剪切出来 返回值
// div.replaceChild(p,strong)



// div.innerHtml('gsdgs')  是覆盖不是追加内容
// div.innerHTML +=  'sdgasrgar'   是追加内容
// div.innerText 是查内部文本

// element节点的一些方法
// element.setAttribute()
// element.getAttribute()

// a.getAttribute('name')



// 封装函数insertAfter 功能类似insertBefore

// Element.prototype.insertAfter = function(targetNode,afterNode) {
//   var beforeNode = afterNode.nextElementSibling
//   if(beforeNode == null) {
//     this.appendChild(targetNode)
//   }else{
//     this.insertBefore(targetNode,beforeNode)
//   }

// }





</script>

</html>